home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / bin / update-gconf-defaults < prev    next >
Text File  |  2009-10-07  |  5KB  |  175 lines

  1. #! /usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. #
  4. # ┬⌐ 2005 Josselin Mouette <joss@debian.org>
  5. # Licensed under the GNU LGPL, see /usr/share/common-licenses/LGPL-2.1
  6.  
  7. treefile = '%gconf-tree.xml'
  8.  
  9. import os,tempfile,shutil,sys
  10. from optparse import OptionParser
  11.  
  12. parser = OptionParser()
  13. parser.add_option("--source", dest="source_dir", default="/usr/share/gconf/defaults",
  14.                   help="directory where to find the defaults", metavar="DIR")
  15. parser.add_option("--destination", dest="dest_dir", default="/var/lib/gconf/debian.defaults",
  16.                   help="directory where to build the GConf tree", metavar="DIR")
  17. parser.add_option("--mandatory", action="store_true", default=False, dest="mandatory",
  18.                   help="select mandatory settings directories")
  19. parser.add_option("--no-signal", action="store_false", default=True, dest="signal",
  20.                   help="do not send SIGHUP the running gconfd-2 processes")
  21. parser.add_option("--only-if-changed", action="store_true", default=False, dest="ifchanged",
  22.                   help="only regenerate configuration if needed")
  23.  
  24. (options, args) = parser.parse_args()
  25.  
  26. if options.mandatory:
  27.     options.source_dir="/usr/share/gconf/mandatory"
  28.     options.dest_dir="/var/lib/gconf/debian.mandatory"
  29.  
  30. if not os.path.isdir(options.source_dir):
  31.     parser.error("Source directory does not exist.")
  32. if not os.path.isdir(options.dest_dir):
  33.     parser.error("Destination directory does not exist.")
  34. if not os.access(options.source_dir,os.R_OK|os.X_OK):
  35.     parser.error("Source directory is not readable.")
  36. if not os.access(options.dest_dir,os.W_OK|os.X_OK):
  37.     parser.error("Destination directory is not writable.")
  38.  
  39. save_stdout=os.dup(1)
  40. os.close(1)
  41.  
  42. def cleanup():
  43.   os.dup2(save_stdout,1)
  44.   os.close(save_stdout)
  45.   shutil.rmtree(tmp_dir)
  46.  
  47. def htmlescape(str):
  48.   return str.replace('&','&').replace('>','>').replace('<','<').replace('"','"')
  49.  
  50. def int_entry(value):
  51.   return '  <int>' + value + '</int>\n'
  52.  
  53. def bool_entry(value):
  54.   return '  <bool>' + value + '</bool>\n'
  55.  
  56. def float_entry(value):
  57.   return '  <float>' + value + '</float>\n'
  58.  
  59. def string_entry(value):
  60.   return '  <string>' + htmlescape(value) + '</string>\n'
  61.  
  62. def list_entry(value):
  63.   ret = '  <list type="string">\n'
  64.   for v in value[1:-1].split(','):
  65.     ret += '    <value><string>' + htmlescape(v) + '</string></value>\n'
  66.   ret += '  </list>\n'
  67.   return ret
  68.  
  69.  
  70. def listcmp(a,b):
  71.   """Number of starting similar elements in a and b"""
  72.   m = min(len(a),len(b))
  73.   for i in range(m):
  74.     if a[i] != b[i]:
  75.       return i
  76.   return m
  77.  
  78. def apply_entries(filename):
  79.   res=os.spawnvpe(os.P_WAIT,'gconftool-2',
  80.            ['gconftool-2','--direct','--config-source',
  81.             'xml:merged:'+tmp_gconf,'--load',filename],
  82.            {'HOME': tmp_home})
  83.   if res:
  84.     cleanup()
  85.     sys.exit(res)
  86.  
  87. gconf_val = {}
  88.  
  89. def write_and_apply_entries(filename):
  90.   out=file(filename,'w')
  91.   out.write('<gconfentryfile>\n<entrylist base="/">\n')
  92.   for key in gconf_val:
  93.     out.write('<entry>\n<key>' + key + '</key>\n<value>\n')
  94.     # write the current entry
  95.     value = gconf_val[key]
  96.     if value[0] == '"' and value[-1] == '"':
  97.       out.write(string_entry(value[1:-1]))
  98.     elif value in ['true','false']:
  99.       out.write(bool_entry(value))
  100.     elif value[0] == '[' and value[-1] == ']':
  101.       out.write(list_entry(value))
  102.     elif value.isdigit():
  103.       out.write(int_entry(value))
  104.     else:
  105.       try:
  106.         float(value)
  107.         out.write(float_entry(value))
  108.       except ValueError:
  109.         out.write(string_entry(value))
  110.     out.write('</value>\n</entry>\n')
  111.   out.write('</entrylist>\n</gconfentryfile>\n')
  112.   out.close()
  113.   apply_entries(filename)
  114.  
  115. def read_entries(filename):
  116.   for line in file(filename):
  117.     l = line.rstrip('\n').split(None,1)
  118.     if len(l) == 2 and not l[0].startswith('#'):
  119.       gconf_val[l[0]] = l[1]
  120.  
  121.  
  122. defaults_files = []
  123. for f in os.listdir(options.source_dir):
  124.   for ext in ['.dpkg-tmp', '.bak', '.tmp', '~', '.sav', '.save']:
  125.     if f.endswith(ext):
  126.       break
  127.   else:
  128.     defaults_files.append(f)
  129. defaults_files.sort()
  130.  
  131. if options.ifchanged:
  132.   source_stamp = os.stat(options.source_dir).st_mtime
  133.   for f in defaults_files:
  134.     realname=os.path.join(options.source_dir,f)
  135.     source_stamp = max(os.stat(realname).st_mtime,source_stamp)
  136.   try:
  137.     dest_stamp = os.stat(os.path.join(options.dest_dir, treefile)).st_mtime
  138.   except OSError:
  139.     dest_stamp = 0
  140.   if source_stamp < dest_stamp:
  141.     sys.exit(0)
  142.  
  143. tmp_dir=tempfile.mkdtemp(prefix="gconf-")
  144. tmp_home=tmp_dir+'/home'
  145. tmp_gconf=tmp_dir+'/gconf'
  146. tmp_file=tmp_dir+'/temp.entries'
  147.  
  148. for f in defaults_files:
  149.   realname=os.path.join(options.source_dir,f)
  150.   if f.endswith('.entries'):
  151.     if gconf_val:
  152.       write_and_apply_entries(tmp_file)
  153.       gconf_val={}
  154.     apply_entries(realname)
  155.   else:
  156.     read_entries(realname)
  157. if gconf_val:
  158.   write_and_apply_entries(tmp_file)
  159.  
  160. try:
  161.   shutil.copyfile(tmp_gconf+'/'+treefile,options.dest_dir+'/'+treefile+'.tmp')
  162.   os.rename(options.dest_dir+'/'+treefile+'.tmp',options.dest_dir+'/'+treefile)
  163. except IOError:
  164.   # No %gconf-tree.xml file was created.
  165.   try:
  166.     os.remove(options.dest_dir+'/'+treefile)
  167.   except OSError:
  168.     # No existing file
  169.     pass
  170.  
  171. cleanup()
  172.  
  173. if options.signal:
  174.     os.system('kill -s HUP `pidof gconfd-2` >/dev/null 2>&1')
  175.